<?php
# ЭТОТ КЛАСС ЗАЛИТ ИСКЛЮЧИТЕЛЬНО ДЛЯ ТЕСТИРОВАНИЯ
# ОШИБОК В НЁМ ХВАТАЕТ
class User_User {
  
	public function __construct(){
			
	}
	/**
	 * Сообщение пользователю об ошибке или успехе выполнения некоторй операции
	 *
	 * @var string
	 */
	private static $userMessage;
	/**
	 * Тип сообщение пользователю об ошибке или успехе выполнения некоторй операции
	 * <0 - сообщение об ошибке
	 * 0 - нет сообщения
	 * >0 - сообщение об успехе
	 * @var integer
	 */	
	private static $userMessageType;
	/**
	 * Метод возвращает полную информацию о пользователе, относящемся к данной сессии
	 *
	 * @return array - массив с информацией о пользователе
	 */
	public static function getUserOfSession(){
	  static $arrUser;
    if ( (!isset($arrUser)) || ($arrUser == NULL) ) {  
  	  $objSession = User_Session::instance();
      if (! $objSession->getUserId())// если к сессии не относится ни один пользователь, то ничего не возвращаем
        $arrUser = NULL;
  	  else
        $arrUser = self::getUser($objSession->getUserId());
    }
    return $arrUser;
	}
  /**
   * Метод возвращает сообщение, которое следует вывести пользователю
   *
   * @return string
   */
  public static function getUserMessage() {
    return isset(self::$userMessage) ? self::$userMessage : NULL;
  }
  /**
   * Метод возвращает тип сообщения, которое следует вывести пользователю
	 * <0 - сообщение об ошибке
	 * 0 - нет сообщения
	 * >0 - сообщение об успехе
   * @return integer
   */
  public static function getUserMessageType() {
    return isset(self::$userMessageType) ? self::$userMessageType : 0;
  }  
  /**
   * Метод устанавливает сообщение, которое следует вывести пользователю
   *
   * @param string $message
   * @param integer $messageType
   */
	public static function setUserMessage($message, $messageType = -1){
	  self::$userMessage = $message;
	  self::$userMessageType = $messageType;
	}
  /**
   * Метод удаляет сообщение, которое следует вывести пользователю
   *
   */
	public static function deleteUserMessage(){
	  self::$userMessage = NULL;
	  self::$userMessageType = 0;
	}	
	/**
	 * Метод возвращает полную информацию о пользователе по его идентификатору
	 *
	 * @param integer $idUser - идентификатор пользователя
	 * @return array - массив с информацией о пользователе
	 */
	public static function getUser($idUser, $login = NULL){
		$objDB = Service_Database::instance();
		$stmtWhere = " WHERE `user`.`ID_user` = '" . $idUser ."'";
		
		if ($login)
			$stmtWhere = "WHERE `user`.`login` = '" . $login ."'";
		
		$stmt = "SELECT `user`.`ID_user`, 
										`user`.`first_name`, 
										`user`.`last_name`, 
										`user`.`e_mail`, 
										`user`.`login`, 
										`user`.`pic_path`, 
										`user`.`time_zone`, 
										`user`.`post`, 
										`user`.`unread_post`, 
										`user`.`role`,
										`user`.`rating_place`,
										`user`.`money`,
										`user`.`friends_amount`,
										`user`.`friends_request_amount`,
										`user`.`rating`,
										(`user`.`favorite_article_amount` + `user`.`favorite_solution_amount` + 
										 `user`.`favorite_question_amount` + `user`.`favorite_tutorial_lesson_amount` > 0) AS `has_favorites`
      		   FROM `user`" . $stmtWhere;
		return $objDB->selectOne($stmt);
	}	

	/**
	 * Получаем список зарегистрированных пользователей (ДОРАБОТАТЬ)
	 *
	 * @return unknown
	 */
	public function getListOfUsers(){
		$objDB = Service_Database::instance();
		$stat = "SELECT COUNT(`article`.`ID_user`) AS `countArticles`, `user`.`ID_user`, `user`.`first_name`, `user`.`last_name`
				     FROM `user` LEFT JOIN `article` ON `article`.`ID_user`=`user`.`ID_user`
				     GROUP BY `user`.`ID_user`
				     ORDER BY `countArticles` DESC";
		return $objDB->select($stat);
	}
	static public function getUserInfo($userId){
		$objDB = Service_Database::instance();
		$stat = "SELECT * FROM `user` WHERE `ID_user`='" . $userId . "'";
		$arrResult = $objDB->select($stat);
		if (sizeof($arrResult) < 1)
			return false;
		return $arrResult[0];
	}
	
	/**
	 * Проверяет, является ли текущий пользователь админом, модером или обычным пользователем.
	 *
	 * @param string $userRole - роль пользователя
	 * @param int $idUser - ID пользователя
	 * @return bool
	 */
	public static function checkIfUser($strUserRole, $idUser = 0) {
	  switch ($strUserRole) {
	    case 'admin': $userRoleNum = 2; break;
	    case 'moderator': $userRoleNum = 3; break;
	    default: $userRoleNum = 1;
	  }
	  $objSession = User_Session::instance();
    $arrUser = ($idUser == 0) ? self::getUserOfSession() : self::getUser($idUser);
	  return ($arrUser['role'] == $userRoleNum);
	}
	
	static public function registrateUser($userPass, $userName, $userLogin){
		$objDB = Service_Database::instance();
		$strUser = "SELECT `ID_user` FROM `user` WHERE `login`='" . $userLogin ."'";
		if (sizeof($objDB->select($strUser)))
		  return -1;
		else
		{
  		$stat="INSERT INTO `user` (`pass`, `first_name`, `login`, `registration`)
  		       VALUES('" . $userPass . "', '" . $userName . "', '" . $userLogin . "', now())";
  		return $objDB->query($stat);
		}
	}	
	
	/**
	 * получаем никнейм пользователя по id
	 *
	 */
	public static function getLoginById($idUser){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `user`.`login`
		FROM `user`
		WHERE `user`.`ID_user` = " . $idUser;
		return $objDB->selectSimpleField($stmt);
	}
	
	/**
	 * получение id пользователя по никнейму
	 *
	 */
	public static function getUserIdByLogin($nickname){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `user`.`ID_user`
		FROM `user`
		WHERE `user`.`login` = '" . $login . "'";
		return $objDB->selectSimpleField($stmt);
	}

	/**
	 * получение id пользователя по email
	 *
	 */
	public static function getUserIdByEMail($eMail){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `user`.`ID_user`
		FROM `user`
		WHERE `user`.`e_mail` = '" . $eMail . "'";
		return $objDB->selectSimpleField($stmt);
	}

	/**
	 * получение id пользователя по id и essence type сущности
	 *
	 */
	public static function getUserIdByEssence($idEssence, $essenceType){
		$objDB = Service_Database::instance();
		$essenceName = Service_Essence::getEssenceTypeName($essenceType);
		if ($essenceName == 'tutorial_theme_offer' || $essenceName == 'folder'){
			$stmt = "
			SELECT `offer`.`ID_user_first_offered`
			FROM `offer`
			WHERE `offer`.`essence_type`=" . Service_Essence::getEssenceTypeID($essenceName) . " 
			AND `offer`.`ID_offer`=" . $idEssence;
		}
		else {
			$stmt = "
			SELECT `" . $essenceName . "`.`ID_user`
			FROM `" . $essenceName . "`
			WHERE `" . $essenceName . "`.`ID_" . $essenceName . "` = " . $idEssence;
		}
		return $objDB->selectSimpleField($stmt);
	}
	
	/**
	 * получение login пользователя по email
	 *
	 */
	public static function getUserLoginByEMail($eMail){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `user`.`login`
		FROM `user`
		WHERE `user`.`e_mail` = '" . $eMail . "'";
		return $objDB->selectSimpleField($stmt);
	}
	
	/**
	 * получаем e-mail'ы всех пользователей
	 */
	public static function getAllMails(){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `user`.`e_mail`
		FROM `user`";
		return $objDB->selectSimpleArray($stmt);
	}
	
	/**
	 * получаем id всех пользователей
	 */
	public static function getAllUsersId(){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `user`.`ID_user`
		FROM `user`";
		return $objDB->selectSimpleArray($stmt);
	}
	
	
	public function getCountMessages($ID_user){
		$objDB = Service_Database::instance();
		$stat = "SELECT COUNT(`message`.`ID_user_to`) AS countMessage 
		         FROM `message` 
		         WHERE `message`.`reading_date` IS NULL AND `message`.`ID_user_to`='" . $ID_user . "'";
		$messageCount = $objDB->select($stat);
		return $messageCount[0]['countMessage'];
	}
	
	
	/**
	 * Получаем имя пользователя по идентификатору
	 *
	 * @param int $idUser
	 * @return string
	 */
	public static  function getUserNameById($idUser){//автор Горбачев Максим
		$objDB = Service_Database::instance();
		$stmt="
		SELECT `user`.`first_name`, 
					 `user`.`last_name`, 
					 `user`.`login`
	  FROM `user`
	  WHERE `user`.`ID_user` = " . $idUser;
		$arrUser = $objDB->selectOne($stmt);
    if (isset($arrUser['first_name']) or isset($arrUser['last_name']))
            $fullUserName = $arrUser['last_name'] . ' ' . $arrUser['first_name'] . ' (' . $arrUser['login'] . ')';
    else $fullUserName = $arrUser['login'];
		return $fullUserName;
	}
	
	public static function getUserForUserMenu($idUser){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `user`.`first_name`,
						`user`.`last_name`,
						`user`. `pic_path`
		FROM `user`
		WHERE `user`.`ID_user` = " . $idUser;
		return $objDB->selectOne($stmt);
	}
	
	
	/**
	 * функция для вставки информации из профайла пользователя
	 *
	 */
	public static function saveEditProfile($arrUser, $oldPass){
		$arrUser['sex'] == 2 ? $sex = "NULL" : $sex = "'" . $arrUser['sex'] . "'";
		if (!empty($arrUser['password']))
			$md5Pass = md5($arrUser['password']);
		self::checkUser($arrUser);
		$stmtSet = "`birthday` = '" . $arrUser['birthday'] . "', 
								`education` = '" . $arrUser['education'] . "', 
								`hobby` = '" . $arrUser['hobby'] . "', 
								`profession` = '" . $arrUser['profession'] . "',
								`first_name` = '" . $arrUser['firstName'] . "',
								`last_name` = '" . $arrUser['lastName'] . "',
								`site_name` = '" . $arrUser['siteName'] . "',
								`objective` = '" . $arrUser['objective'] . "',
								`site_url` = '" . $arrUser['siteUrl'] . "',
								`professional_aim` = '" . $arrUser['professional_aim'] . "',
								`skills` = '" . $arrUser['skills'] . "',
								`specialization` = '" . $arrUser['specialization'] . "',
								`sex` = " . $sex . ",
								`country` = " . $arrUser['country'] . ",
								/*`time_zone` = " . $arrUser['timeZone'] . ",*/
								`city` = '" . $arrUser['city'] . "'" . (!empty($arrUser['password']) ? ", `pass` = '" . $md5Pass . "'" : NULL);
	  if (isset($arrUser['image']) and $arrUser['delPhoto'] != 'on')
      $stmtSet .= ", `pic_path`='" . $arrUser['image']->getImageExtension() . "'";
    elseif ($arrUser['delPhoto'] == 'on')
    	$stmtSet .= ", `pic_path`=''";
		$objDB = Service_Database::instance();
		$stmt = "
    UPDATE `user` SET " . $stmtSet . "
    WHERE `user`.`ID_user` = '" . $arrUser['idUser'] . "'";
		$objDB->query($stmt);
	  $idUser = $arrUser['idUser'];
	  if (isset($arrUser['image'])){
		  $image = $arrUser['image'];
		  $image->setGoalFolder(IMAGES . 'pictures/user/');
	    $image->setNewImageName($idUser);
	    $image->saveExistingFile();
	    $image->createImageFromFile('b_', 100, 100);
	    $image->createImageFromFile('m_', 80, 80);
	    $image->createImageFromFile('s_', 60, 60);
	    $image->createImageFromFile('vs_', 30, 30);
	  }
	  if (!empty($arrUser['password']) AND $oldPass != $md5Pass) 
	    Service_Notification::sendNotificationPass($arrUser['idUser'], $arrUser['password']);
		return true;
	}
	
	public static function getUsersToAutocomplete($g){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `user`.`last_name`
		FROM `user`
		WHERE `user`.`last_name` = ";
		return $objDB->select($stmt);
	}
	
	/**
	 * функция для проверки получаемых данных в профайл пользователя
	 *
	 * @param unknown_type $arrUser
	 * @return unknown
	 */
	public static function checkUser($arrUser){
	 $e = Exception_Form::instance(); //создаем объект для хранения списка исключений
   if (isset($arrUser['imageErr'])){
     $e->addException('image', $arrUser['imageErr']);	
   }
       
   if ($e->isErrorExists()) // Если мы зафиксировали какие-то исключения, то выдаем окончательное исключение
      throw $e;
  return true; 
	}
	
	
	public static function getAutosugestLogin($q){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `user`.`login`
		FROM `user`
		WHERE `user`.`login` LIKE '" . $q . "%'";
		return $objDB->select($stmt);
	}
	
	/**
	 * функция для получния информации о пользователе в профайл
	 *
	 * @param unknown_type $idUser
	 * @return unknown
	 */
	public static function getProfileInfo($login){
		$objDB = Service_Database::instance();
		$objSession = User_Session::instance();
		$stmt = "
		SELECT `user`.`ID_user`,
					 `user`.`first_name`, 
					 `user`.`last_name`, 
					 `user`.`login`, 
					 `user`.`pic_path`, 
					 `user`.`time_zone`, 
					 `user`.`average_mark`, 
					 `user`.`sex`,
					 `user`.`birthday`,
					 `user`.`education`,
					 `user`.`hobby`,
					 `user`.`hits`,
					 `user`.`rating`,
					 `user`.`professional_aim`,
					 `user`.`skills`,
					 `user`.`specialization`,
					 `user`.`money`,
					 `user`.`site_name`,
					 `user`.`user_status`,
					 `user`.`site_url`,
					 `user`.`visitors`,
					 `user`.`browsing_amount`,
					 `user`.`visits`,
					 `user`.`profession` AS `ID_profession`,
					 `user`.`city`,
					 `user`.`country`,
					 `user`.`objective`,
					 `user`.`comment_amount`,
					 `user`.`registration`,
					 `user`.`question_amount`,
					 `user`.`pass`,
					 `user`.`answer_amount`,
					 `user`.`community_amount`,
					 `user`.`lesson_amount`,
					 `user`.`article_amount`,
					 `user`.`solution_amount`,
					 `user`.`last_impression`,
					 `user`.`voting_amount`,
					 `user`.`difficulty_mark_amount`,
					 `user`.`rating_place`,
					 `user`.`set_mark_amount`,
					 `user`.`friends_request_amount`,
					 `user`.`friends_amount`,
					 `mark`.`mark`,
					 `profession`.`name` AS `profession`,
					 `country`.`name` AS `country_name`,
					 `country`.`alpha2` AS `flag`,
					 `city`.`name` AS `city_name`,
					 `work_search`.`tags`,
					 `work_search`.`price`,
					 `work_search`.`show_price_flag`,
					 `work_search`.`search_flag`,
					 `work_search`.`search_flag_creation`					 
		FROM `user`
		LEFT JOIN `mark` ON `mark`.`ID_essence`=`user`.`ID_user` AND 
							`mark`.`essence_type`=3 AND `mark`.`ID_user`='" . $objSession->getUserId() . "'
		LEFT JOIN `country` ON `user`.`country` = `country`.`ID_country`
		LEFT JOIN `city` ON `user`.`city` = `city`.`ID_city`
		LEFT JOIN `profession` ON `user`.`profession` = `profession`.`ID_profession`
		LEFT JOIN `work_search` ON `work_search`.`ID_work_search` = `user`.`ID_user`
		WHERE `user`.`login` = '" . $login . "'";
		return $objDB->selectOne($stmt);
	}
		
	/**
	 * получаем пользователей с наибольшим рейтингом
	 */
	public static function getPopUsers($limit = NULL){
		!empty($limit) ? $limit = " LIMIT " . $limit : NULL;
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `user`.`ID_user`, 
					 `user`.`first_name`, 
					 `user`.`last_name`, 
					 `user`.`pic_path`,
					 `user`.`rating`, 
					 `user`.`comment_amount`, 
					 `user`.`average_mark`, 
					 `profession`.`name` AS `profession`,
					 `country`.`alpha2` AS `flag`
		FROM `user`
		LEFT JOIN `country` ON `user`.`country` = `country`.`ID_country`
		LEFT JOIN `profession` ON `user`.`profession` = `profession`.`ID_profession`
		ORDER BY `user`.`rating` DESC" . $limit;
		return $objDB->select($stmt);
	}	
	
	/**
	 * получаем рейтинг пользователя
	 */
	static function getUserRating($idUser){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `user`.`rating`
		FROM `user`
		WHERE `user`.`ID_user` = " . $idUser;
		return $objDB->selectSimpleField($stmt);
	}
	
	/**
	 * функция для получения всех стран
	 *
	 * @return unknown
	 */
	public static function getAllCountry(){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `country`.`ID_country`, `country`.`name`
		FROM `country`
		ORDER BY `country`.`name` ASC";
		return $objDB->select($stmt);
	}
	
	/**
	 * функция для получения всех стран
	 *
	 */
	public static function getFirstCountry(){
		$objDB = Service_Database::instance();
		$stmt = "
			SELECT `country`.`ID_country`, `country`.`name`
			FROM `country`
			ORDER BY `country`.`count` DESC
			LIMIT 10";
		return $objDB->select($stmt);
	}
	
	
	/**
	 * функция для получения городов опредеенной страны
	 *
	 * @param unknown_type $idCountry
	 * @return unknown
	 */
	public static function getAllCity($idCountry){
		if ($idCountry != NULL){
			$objDB = Service_Database::instance();
			$stmt = "
			SELECT `city`.`ID_city`, `city`.`name`
			FROM `city`
			WHERE `city`.`ID_country` = '" . $idCountry . "'
			ORDER BY `city`.`name` ASC";
			return $objDB->select($stmt);
		}
		else 
			return NULL;
	}
	
	/**
	 * получем город по id
	 */
	public static function getCityNameById($idCity){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `city`.`name`
		FROM `city`
		WHERE `city`.`ID_city` = " . $idCity . "
		LIMIT 1";
		return $objDB->selectSimpleField($stmt);
	}
	
	/**
	 * функция для получения самых популярных городов опредеенной страны
	 *
	 */
	public static function getFirstCity($idCountry){
		if ($idCountry != NULL){
			$objDB = Service_Database::instance();
			$stmt = "
			SELECT `city`.`ID_city`, `city`.`name`
			FROM `city`
			WHERE `city`.`ID_country` = " . $idCountry . "
			ORDER BY `city`.`count` DESC
			LIMIT 11";
			return $objDB->select($stmt);
		}
		else 
			return NULL;
	}
	
	/**
	 * получаем список профессий
	 *
	 * @return unknown
	 */
	public static function getAllProfessions(){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `profession`.`name`, 
					 `profession`.`ID_profession`
		FROM `profession`";
		return $objDB->select($stmt);
	}
	
	public static function getUserLogin($idUser){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `user`.`login`
		FROM `user`
		WHERE `user`.`ID_user` = '" . $idUser . "'";
		return $objDB->selectSimpleField($stmt);
	}	
	
	/**
	 * получаемый 3 рутовых раздела с наибольшим рейтингом для пользовательского меню
	 */
	public static function getRatingRootFolderForUserMenu($idUser){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `folder_rating`.`place`,
					 `folder_rating`.`ID_folder`,
					 `folder_rating`.`recount_temp_rating`,
					 `folder`.`name`
		FROM `folder`
		LEFT JOIN `folder_rating` ON `folder_rating`.`ID_folder` = `folder`.`ID_folder`
		WHERE `folder`.`ID_root_folder` IS NULL AND `folder_rating`.`ID_user` = " . $idUser . "
  	GROUP BY `folder`.`ID_folder`
		ORDER BY `folder_rating`.`recount_temp_rating` DESC
		LIMIT 3";
		return $objDB->select($stmt);
	}
	
	/**
	 * получаем профессию пользователя
	 *
	 * @param unknown_type $idUser
	 */
	/*public static function getUserProfession($idUser){
		$objDB = Service_Database::instance();
		$stmt ="
		SELECT `profession`.`name`
		LEFT JOIN `profession` ON `user`.`profession` = `profession`.`ID_profession`
		FROM `professin`";
		return $objDB->selectSimpleField($stmt);
	}*/
	
	/**
	 * Получает идентификатор пользователя по его логину
	 *
	 * @param string $login
	 * @return integer
	 */
  public static function getIdByLogin($login) {
    $objDB = Service_Database::instance();//Получаем подключение к БД
    $stmt = "SELECT `ID_user` FROM " . TABLE_USER . " WHERE `login` = '" . $login . "'";  //формируем SQL-запрос
    return $objDB->selectSimpleField($stmt);  //Осуществляем SQL-запрос
  }
	/**
	 * Устанавливает ремя последнего входа
	 *
	 */
	public static function setLoginTime() {
		$objDB = Service_Database::instance();//Получаем подключение к БД
		$objSession = User_Session::instance();
		$userId = $objSession->getUserId();
		if(!$userId)
		  return NULL;
	  $stmt = "UPDATE `user`
    				 SET  `login_time` = '" . Service_Date::gLocalTime2BD() . "'
    				 WHERE `user`.`ID_user` = '" . $userId . "'";
		return $objDB->query($stmt);
	}
	/**
	 * Добавляет +1 к посещениям пользователя
	 *
	 */
	public static function addVisit() {
		$objDB = Service_Database::instance();//Получаем подключение к БД
		$objSession = User_Session::instance();
		$userId = $objSession->getUserId();
		if(!$userId)
		  return NULL;
	  $stmt = "UPDATE `user`
    				SET  `visits` = (`visits`+1)
    				WHERE `user`.`ID_user` = '" . $userId . "'";
		return $objDB->query($stmt);
	}
	/**
	 * Устанавливает татус присутствия пользователя на сайте
	 *
	 */
	public static function setStatus($status, $userId) {
		$objDB = Service_Database::instance();//Получаем подключение к БД
		$objSession = User_Session::instance();
		if (!$userId)
		  $userId = $objSession->getUserId();
		if(!$userId)
		  return NULL;
	  $stmt = "UPDATE `user`
    				SET  `user_status` = '" . $status . "'
    				WHERE `user`.`ID_user` = '" . $userId . "'";
	  return $objDB->query($stmt);
	}
/**
	 * Добавляет +1 к хитам пользователя
	 *
	 */
	public static function addHit() {
		$objDB = Service_Database::instance();//Получаем подключение к БД
		$objSession = User_Session::instance();
		$userId = $objSession->getUserId();
		if(!$userId)
		  return NULL;
	  $stmt = "UPDATE `user`
    				SET  `hits` = (`hits`+1)
    				WHERE `user`.`ID_user` = '" . $userId . "'";
		return $objDB->query($stmt);
	}
	
	/**
	 * Метод устанавливает нулевой статус всем пользователям, которые не присутствуют на сайте уже 15 минут
	 *
	 */
	public static function setZeroStatusByTimeOut() {
		$objDB = Service_Database::instance();//Получаем подключение к БД
		$stmt ="
		UPDATE `user`
    LEFT JOIN `session` ON `session`.`ID_user` = `user`.`ID_user`
    SET  `user_status` = 0
    WHERE ((`session`.`last_impression` IS NULL) OR (`session`.`last_impression` < DATE_SUB(now(), INTERVAL 15 MINUTE))) AND `user_status` > 0;";
		return $objDB->query($stmt);
	}
	
	/**
	 * уменьшаем число пользователей с указаным городом
	 */
	public static function decrementCity($idCity){
		$objDB = Service_Database::instance();
		$stmt = "
		UPDATE `city` SET `count` = (`count` - 1)
		WHERE `city`.`ID_city` = " . $idCity;
		return $objDB->query($stmt);
	}
	
	/**
	 * увеличиваем число пользователей с указаным городом
	 */
	public static function incrementCity($idCity){
		$objDB = Service_Database::instance();
		$stmt = "
		UPDATE `city` SET `count` = (`count` + 1)
		WHERE `city`.`ID_city` = " . $idCity;
		return $objDB->query($stmt);
	}
	
	/**
	 * уменьшаем число пользователей с указаной страной
	 */
	public static function decrementCountry($idCountry){
		$objDB = Service_Database::instance();
		$stmt = "
		UPDATE `country` SET `count` = (`count` - 1)
		WHERE `country`.`ID_country` = " . $idCountry;
		return $objDB->query($stmt);
	}
	
	/**
	 * увеличиваем число пользователей с указаным городом
	 */
	public static function incrementCountry($idCountry){
		$objDB = Service_Database::instance();
		$stmt = "
		UPDATE `country` SET `count` = (`count` + 1)
		WHERE `country`.`ID_country` = " . $idCountry;
		return $objDB->query($stmt);
	}
	
	/**
	 * инкремент количества сущностей пользователя в таблице `user`
	 */
	public static function incrementEssenceInUserTable($essence, $idUser){
		$objDB = Service_Database::instance();
		$stmt = "
		UPDATE `user` 
		SET `user`.`" . $essence . "_amount` = (`user`.`" . $essence . "_amount` + 1)
		WHERE `user`.`ID_user` = " . $idUser;
		return $objDB->query($stmt);
	}
	
	/**
	 * декримент количества сущностей пользователя в таблице `user`
	 */
	public static function decrementEssenceInUserTable($essence, $idUser){
		$objDB = Service_Database::instance();
		$stmt = "
		UPDATE `user` 
		SET `user`.`" . $essence . "_amount` = (`user`.`" . $essence . "_amount` - 1)
		WHERE `user`.`ID_user` = " . $idUser;
		return $objDB->query($stmt);		
	}
	
	/**
   * Проверка формы для приглашения друзей
   *
   * @param unknown_type $arrInvite
   * @return unknown
   */
  public static function checkInvite($arrInvite) {
  	$e = Exception_Form::instance(); //создаем объект для хранения списка исключений

		$arrKeys = array_keys($arrInvite['form']);
  	for ($i = 0; $i < sizeof($arrKeys); $i++) {
	  	if (strlen($arrInvite['form'][$arrKeys[$i]]['e_mail']) < 10)
	  	  $e->addException('form_'.$arrKeys[$i].'_e_mail', 'Не заполнен E-Mail');
	  	if (User_User::isEMailExist($arrInvite['form'][$arrKeys[$i]]['e_mail'])) {
	  		$userId = User_User::getUserIdByEmail($arrInvite['form'][$arrKeys[$i]]['e_mail']);
	  		$arrUser = User_User::getUser($userId);
	  	  $e->addException('form_'.$arrKeys[$i].'_e_mail', 'Такой E-Mail уже зарегистрирован. Его <a href=\'' . W_ABSPATH . 'user/' . $arrUser['login'] . '\'>профиль</a>');
	  	}
	  	if (strlen($arrInvite['form'][$arrKeys[$i]]['name']) < 3)
	  	  $e->addException('form_'.$arrKeys[$i].'_name', 'Не заполнено имя');
		}

  	if ($arrInvite['card'] <= 0)
  	  $e->addException('card', 'Не выбрана картинка');
  	if (strlen($arrInvite['message']) < 3)
  	  $e->addException('message', 'Не заполнено поле сообщения');

    if ($e->isErrorExists()) // Если мы зафиксировали какие-то исключения, то выдаем окончательное исключение
      throw $e;
		return true;
  }

  /**
   * Сохраняем инфу о приглашениях
   *
   * @param unknown_type $arrInvite
   * @param unknown_type $userId
   */
  public static function saveFriendInvite($arrInvite, $userId, $i) {
		$objDB = Service_Database::instance();
		$stat="INSERT INTO `friends_invite` (`ID_user`, `e_mail`, `name`, `creation`)
		       VALUES('" . $userId . "', '" .  $arrInvite['form'][$i]['e_mail'] . "', '" . $arrInvite['form'][$i]['name'] . "', '" . Service_Date::gLocalTime2BD() . "')";
		$objDB->query($stat);
  }
  
/**
   * Возвращает пользователей приглашенных данным
   *
   * @param integer $userId
   * @return array
   */
  public static function getUserFriendInvites($userId) {
  	$objDB = Service_Database::instance();//Получаем подключение к БД
  	$stmt = "SELECT `friends_invite`.`e_mail`, `friends_invite`.`name`, `user`.`login`, `friends_invite`.`creation`
  	FROM `friends_invite`
  	LEFT JOIN `user` ON `user`.`e_mail` = `friends_invite`.`e_mail`
  	WHERE `friends_invite`.`ID_user` = '" . $userId . "'";  //формируем SQL-запрос
  	return $objDB->select($stmt);
  }

    /**
   * Возвращает всех приглашенных пользователей
   *
   * @return array
   */
  public static function getFriendInvites() {
  	$objDB = Service_Database::instance();//Получаем подключение к БД
  	$stmt = "SELECT `friends_invite`.`e_mail`, `friends_invite`.`name`, `user`.`login`, `friends_invite`.`creation`
  	FROM `friends_invite`
  	LEFT JOIN `user` ON `user`.`e_mail` = `friends_invite`.`e_mail`";  //формируем SQL-запрос
  	return $objDB->select($stmt);
  }
  
  /**
   * сохраняем настройки оповещения
   */
  public static function saveNotification($idUser, $arrNotification){
  	$objDB = Service_Database::instance();
  	$stmt = "
  	SELECT COUNT(`notification`.`ID_user`)
  	FROM `notification`
  	WHERE `notification`.`ID_user` = " . $idUser;
  	$exist = $objDB->selectSimpleField($stmt);
  	if ($exist){
  		$stmt = "
  		UPDATE `notification` SET
  		`topic` = " . $arrNotification['topic'] . ",
  		`answer` = " . $arrNotification['answer'] . ",
  		`comments` = " . $arrNotification['comments'] . ",
  		`password` = " . $arrNotification['pass'] . ",
  		`friend` = " . $arrNotification['friend'] . ",
  		`mail` = " . $arrNotification['mail'] . "
  		WHERE `notification`.`ID_user` = " . $idUser;
  		return $objDB->query($stmt);
  	}
  	else {
  		$stmt = "
  		INSERT INTO `notification` (`ID_user`, `topic`, `answer`, `comments`, `password`,  `mail`, `friend`)
  						VALUES(" . $idUser . ", " . $arrNotification['topic'] . ", " . $arrNotification['answer'] . ", " . $arrNotification['comments'] . ", " . $arrNotification['pass'] . ", " . $arrNotification['mail'] . ", " . $arrNotification['friend'] . ")";
  		return $objDB->query($stmt);
  	} 
  }
  
  /**
   * получаем настройки оповещения
   */
  public static function getNotification($idUser){
  	$objDB = Service_Database::instance();
  	$stmt = "
  	SELECT `notification`.`topic`,
  				 `notification`.`answer`,
  				 `notification`.`comments`,
  				 `notification`.`mail`,
  				 `notification`.`password`,
  				 `notification`.`friend`
  	FROM `notification`
  	WHERE `notification`.`ID_user` = " . $idUser;
  	return $objDB->selectOne($stmt);
  }
  
  /**
   * получаем конкретные настройки оповещения
   */
  public static function getOneNotification($idUser, $type){
  	/*
  	$type
  	- topic
  	- answer
  	- comments
  	- mail
  	- password
  	- friend
  	*/
  	$objDB = Service_Database::instance();
  	$stmt = "
  	SELECT `notification`.`" . $type . "`
  	FROM `notification`
  	WHERE `notification`.`ID_user` = " . $idUser;
  	return $objDB->selectSimpleField($stmt);
  }
  
	/**
	 * Получает id пользователя
	 *
	 * @return integer
	 */
	public static function getId() {
		$objSesion = User_Session::instance();
		return $objSesion->getUserId();
	}
	
	/**
	 * сохраняем дату когда пользователь был на сайте
	 *
	 */
	public static function upadteLastImpression($idUser){
		$objDB = Service_Database::instance();
		$stmt = "
		UPDATE `user` 
		SET `last_impression` = '" . Service_Date::gLocalTime2BD() . "'
		WHERE `user`.`ID_user` = " . $idUser;
		return $objDB->query($stmt);
	}
	/**
	 * Сохраняет время послденего просмотра пользователем сущности
	 *
	 * @param int $idEssence
	 * @param int $essenceType
	 * @return bool
	 */
	public static function updateLastEssenceImpression($idEssence, $essenceType){
		$objDB = Service_Database::instance();
		$objSesion = User_Session::instance();
		$idUser = $objSesion->getUserId();
		$essenceType = Service_Essence::getEssenceTypeID($essenceType);
		$stmt = " SELECT `user_essence_last_impress_time`.`ID_user`
							FROM `user_essence_last_impress_time`
							WHERE `user_essence_last_impress_time`.`ID_user`=".$idUser." 
							AND `user_essence_last_impress_time`.`ID_essence`=".$idEssence." 
							AND `user_essence_last_impress_time`.`essence_type`=".$essenceType;
		
		if (!$objDB->isRecordExist($stmt))
			return $objDB->insert('user_essence_last_impress_time', array('ID_user'=>$idUser, 'ID_essence'=>$idEssence, 'essence_type'=>$essenceType, 'impress_time'=>Service_Date::gLocalTime2BD()));
		else 
			return $objDB->update('user_essence_last_impress_time', array('impress_time'=>Service_Date::gLocalTime2BD()), array('ID_user'=>$idUser, 'ID_essence'=>$idEssence, 'essence_type'=>$essenceType));
	}
	
	public static function getLastEssenceImpression($idEssence, $essenceType){
		$objDB = Service_Database::instance();
		$objSesion = User_Session::instance();
		$idUser = $objSesion->getUserId();
		$essenceType = Service_Essence::getEssenceTypeID($essenceType);
		$stmt = " SELECT `user_essence_last_impress_time`.`impress_time`
							FROM `user_essence_last_impress_time`
							WHERE `user_essence_last_impress_time`.`ID_user`=".$idUser." 
							AND `user_essence_last_impress_time`.`ID_essence`=".$idEssence." 
							AND `user_essence_last_impress_time`.`essence_type`=".$essenceType;		
	 return $objDB->selectSimpleField($stmt);		
	}
	
	public static function addEventAddMarkToUserTable($markType){
		$objDB = Service_Database::instance();
		$objSession = User_Session::instance();
		$idUser = $objSession->getUserId();
		switch ($markType){
			case 0: $field = '`set_mark_amount`'; break;
			case 1: $field = '`difficulty_mark_amount`'; break;
			case 3: $field = '`voting_amount`'; break;
		}
		
		$stmt = "
		UPDATE `user` 
		SET " . $field . " = (" . $field . "+1)
		WHERE `user`.`ID_user` = " . $idUser;
		$objDB->query($stmt);
	}
	
	/**
	 * добавляем место работы(профайл)
	 *
	 */
	public static function insertOperationalExperience($arrExperience, $idUser){
		$objDB = Service_Database::instance();
		$stmt = "
		INSERT INTO `user_operational_experience`(`ID_user`, 
																							`company`, 
																							`site`, 
																							`company_size`, 
																							`job`, 
																							`start_month`, 
																							`start_year`, 
																							`end_month`, 
																							`end_year`, 
																							`charge`, 
																							`progress`, 
																							`additionally`) 
		VALUES (" . $idUser . ", 
					 '" . $arrExperience['company'] . "', 
					 '" . $arrExperience['site'] . "', 
					  " . $arrExperience['company_size'] . ", 
					 '" . $arrExperience['job'] . "', 
					  " . $arrExperience['start_month'] . ", 
					  " . $arrExperience['start_year'] . ", 
					 '" . $arrExperience['end_month'] . "', 
					 '" . $arrExperience['end_year'] . "', 
					 '" . $arrExperience['charge'] . "', 
					 '" . $arrExperience['progress'] . "', 
					 '" . $arrExperience['additionally'] . "')";
		return $objDB->query($stmt);
	}
	
	/**
	 * обновляем место работы(профайл)
	 *
	 */
	public static function updateOperationalExperience($arrExperience, $ID_user_operational_experience){
		$objDB = Service_Database::instance();
		$stmt = "
		UPDATE `user_operational_experience`
		SET `company` = '" . $arrExperience['company'] . "', 
				`site` = '" . $arrExperience['site'] . "',
				`company_size` = " . $arrExperience['company_size'] . ", 
				`job` = '" . $arrExperience['job'] . "', 
				`start_month` = " . $arrExperience['start_month'] . ", 
				`start_year` = " . $arrExperience['start_year'] . ", 
				`end_month` = '" . $arrExperience['end_month'] . "', 
				`end_year` = '" . $arrExperience['end_year'] . "', 
				`charge` = '" . $arrExperience['charge'] . "', 
				`progress` = '" . $arrExperience['progress'] . "', 
				`additionally` = '" . $arrExperience['additionally'] . "'
		WHERE `user_operational_experience`.`ID_user_operational_experience` = " . $ID_user_operational_experience;
		return $objDB->query($stmt);
	}
	
	/**
	 * получаем места работы(профайл)
	 *
	 */
	public static function getOperationalExperience($idUser){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT *
		FROM `user_operational_experience`
		WHERE `user_operational_experience`.`ID_user` = " . $idUser;
		return $objDB->select($stmt);
	}
	
	/**
	 * удялем место работы
	 *
	 */
	public static function deleteOperationalExperience($idOperationalExperience, $idUser){
		$objDB = Service_Database::instance();
		$stmt = "
		DELETE FROM `user_operational_experience`
		WHERE `user_operational_experience`.`ID_user_operational_experience` = " . $idOperationalExperience . " AND `user_operational_experience`.`ID_user` = " . $idUser;
		$objDB->query($stmt);
	}
	
	/**
	 * сохаряем информацию о поиске работы
	 *
	 * @param unknown_type $arrWork
	 * @return unknown
	 */
	public static function saveWorkSearch($arrWork){
		$objDB = Service_Database::instance();
		$objSession = User_Session::instance();
		$idUser = $objSession->getUserId();
		$stmt = "
		SELECT *
		FROM `work_search`
		WHERE `work_search`.`ID_work_search` = " . $idUser;
		$arrWorkSelect = $objDB->selectOne($stmt);
		
		if (!empty($arrWorkSelect)){
			$updateTime = $arrWorkSelect['search_flag_creation'];
			
			if ($arrWork['search_flag'] == true AND $arrWorkSelect['search_flag'] == false)
				$updateTime = Service_Date::gLocalTime2BD();
			elseif ($arrWork['search_flag'] == false)
				$updateTime = '';
				
			$stmt = "
			UPDATE `work_search`
			SET `search_flag` = " . $arrWork['search_flag'] . ",
					`price` = " . $arrWork['price'] . ",
					`search_flag_creation` = '" . $updateTime . "',
					`show_price_flag` = " . $arrWork['show_price_flag'] . "
			WHERE `work_search`.`ID_work_search` = " . $idUser;
			return $objDB->query($stmt);
		}
		else {
			$stmt = "
			INSERT INTO `work_search` (`ID_work_search`, `search_flag`, `price`, `search_flag_creation`, `show_price_flag`)
			VALUES (" . $idUser . ", " . $arrWork['search_flag'] . ", " . $arrWork['price'] . ", '" . ($arrWork['search_flag'] ? Service_Date::gLocalTime2BD() : '') . "', " . $arrWork['show_price_flag'] . ")";
			return $objDB->query($stmt);
		}
	}
	
	/**
	 * получаем информацию о поиске работы
	 */
	public static function getWorkSearch($idUser){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `work_search`.`ID_work_search` AS `ID_user`,
					 `work_search`.`search_flag`,
					 `work_search`.`price`,
					 `work_search`.`search_flag_creation`,
					 `work_search`.`show_price_flag`,
					 `work_search`.`tags`
		FROM `work_search`
		WHERE `work_search`.`ID_work_search` = " . $idUser;
		return $objDB->selectOne($stmt);
	}
}
?>